#include <logbase.h>
#include <genrand.h>
#include <pthread.h>
#include <sys/msg.h>
#include <cstring.h>
#include <threadExcuter.h>
#include <lxMessege.h>

int main()
{
    /*测试说明:
    msgsnd：__msgsz，发送大小是减去(long)长度后的数据大小，返回0成功。<0失败
    msgrcv：__msgsz，接收大小是减去(long)长度后的数据大小，返回数据大小成功。<0失败。__msgtyp，0表示接收任何类型的数据。>0获取指定类型的数据
    */
    typedef struct
    {
        long channelId;
        char databuf[8000];
    } myCheckMsgStc;
    myCheckMsgStc tmpSndData;
    myCheckMsgStc tmpRcvData;
    int tmpfd = msgget(0xabc123, 0666 | IPC_CREAT);
    logdebugc("%d", tmpfd);
#if 0
        {
            // test 1
            struct msqid_ds msginfo;
            if (msgctl(tmpfd, IPC_STAT, &msginfo) == -1)
            { //
                perror("msgctl get info size error!\n");
                return -1;
            }
            msginfo.msg_qbytes = (5 * 1024 * 1024); //
            if (msgctl(tmpfd, IPC_SET, &msginfo) == -1)
            { //
                perror("msgctl set info size error!\n");
                // return -1; // run is ok
            }
            tmpSndData.channelId = 101;
            memset(tmpSndData.databuf, '1', sizeof(tmpSndData.databuf));
            for (int i = 0; i < 100; i++)
            {
                int tmpflag = msgsnd(tmpfd, &tmpSndData, sizeof(tmpRcvData) - sizeof(long), IPC_NOWAIT);
                if (tmpflag < 0)
                {
                    logerrorc("%d, id=%d", tmpflag, i);
                    return -1;
                }
            }
            return 1;
        }
#endif
#if 1
    {
            struct msgOptStct tmpMsg;
            msgOptInit(&tmpMsg, 0xabc123, 222);
            logdebugc("%d", tmpMsg.msgfd);
            msgOptClean(&tmpMsg, 0);
            return 1;
    }
#endif
#if 1
    {
        while (1)
        {
            if (msgrcv(tmpfd, &tmpRcvData, sizeof(tmpRcvData), 0 /*101*/, IPC_NOWAIT) > 0)
            {
                continue;
            }
            break;
        }
        return 1;
        tmpSndData.channelId = 101;
        memset(tmpSndData.databuf, '1', sizeof(tmpSndData.databuf));
        int tmpflag = msgsnd(tmpfd, &tmpSndData, 7000, IPC_NOWAIT);
        logdebugc("snd=%d", tmpflag);
        memset(&tmpRcvData, 0, sizeof(tmpRcvData));
        tmpflag = msgrcv(tmpfd, &tmpRcvData, sizeof(tmpRcvData) - 8, 101, IPC_NOWAIT);
        logdebugc("rcv=%d", tmpflag);
        for (int i = 0; i < sizeof(tmpSndData.databuf); i++)
        {
            if (tmpSndData.databuf[i] != tmpRcvData.databuf[i])
            {
                logdebugc("xx-%d", i); // send size
                break;
            }
        }
        // tmpflag = msgsnd(tmpfd, &tmpSndData, 7000, IPC_NOWAIT);
        // msgctl(tmpfd, IPC_RMID, NULL);
        return 1;
    }
#endif
    return -1;
}
